001 /* EVolve - an Extensible Software Visualization Framework
002 * Copyright (C) 2001-2002 Qin Wang
003 *
004 * This library is free software; you can redistribute it and/or
005 * modify it under the terms of the GNU Library General Public
006 * License as published by the Free Software Foundation; either
007 * version 2 of the License, or (at your option) any later version.
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Library General Public License for more details.
013 *
014 * You should have received a copy of the GNU Library General Public
015 * License along with this library; if not, write to the
016 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
017 * Boston, MA 02111-1307, USA.
018 */
019
020 /*
021 * EVolve is distributed at http://www.sable.mcgill.ca/EVolve/
022 */
023
024 package EVolve.visualization;
025
026 import EVolve.*;
027 import EVolve.util.phasedetectors.*;
028 import EVolve.exceptions.NoDataPlotException;
029 import EVolve.visualization.VizFactory.VisualizationFactory;
030 import EVolve.visualization.XYViz.XYVisualization;
031 import EVolve.data.*;
032 import java.awt.*;
033 import java.awt.event.*;
034 import java.util.*;
035 import javax.swing.*;
036
037 public class VisualizationManager {
038 private VisualizationFactory[] factory;
039 private ArrayList visualizationList;
040 private ArrayList toVisualize;
041 private Visualization[][] visualization;
042
043 private JDialog dialog;
044 private JList listVisualization;
045 private DefaultListModel model;
046
047 private boolean phaseDetectorEnabled;
048 private PhaseOperation phaseOperation;
049
050 public VisualizationManager(VisualizationFactory[] factory) {
051 this.factory = factory;
052 this.visualizationList = new ArrayList();
053 this.toVisualize = new ArrayList();
054 this.dialog = null;
055 phaseDetectorEnabled = false;
056 phaseOperation = new PhaseOperation();
057 }
058
059 public void init() {
060 ArrayList newVisualizationList = new ArrayList();
061 ArrayList newToVisualize = new ArrayList();
062
063 for (int i=0; i<visualizationList.size(); i++) {
064 Visualization visual = (Visualization)visualizationList.get(i);
065 if (visual.getDataSourceId() != Scene.getDataSourceManager().getCurrentDataSourceId())
066 newVisualizationList.add(visual);
067 }
068
069 for (int i=0; i<toVisualize.size(); i++) {
070 Visualization visual = (Visualization)toVisualize.get(i);
071 if (visual.getDataSourceId() != Scene.getDataSourceManager().getCurrentDataSourceId())
072 newToVisualize.add(visual);
073 }
074 visualizationList = newVisualizationList;
075 toVisualize = newToVisualize;
076 }
077
078 private void createDialog() {
079 dialog = new JDialog(Scene.getFrame(), "Select Visualizations", true);
080 model = new DefaultListModel();
081 listVisualization = new JList(model);
082 listVisualization.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
083
084 JScrollPane scrollPane = new JScrollPane(listVisualization);
085 scrollPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Choose visualizations"));
086 dialog.getContentPane().add(scrollPane, BorderLayout.CENTER);
087
088 JPanel panelButton = new JPanel(new FlowLayout());
089 dialog.getContentPane().add(panelButton, BorderLayout.SOUTH);
090
091 JButton buttonApply = new JButton("Apply");
092 buttonApply.addActionListener(new ActionListener() {
093 public void actionPerformed(ActionEvent e) {
094 dialogApply();
095 }
096 });
097 panelButton.add(buttonApply);
098
099 JButton buttonCancel = new JButton("Cancel");
100 buttonCancel.addActionListener(new ActionListener() {
101 public void actionPerformed(ActionEvent e) {
102 dialogCancel();
103 }
104 });
105 panelButton.add(buttonCancel);
106 }
107
108 public String[] getFactoryName() {
109 ArrayList list = new ArrayList();
110 for (int i = 0; i < factory.length; i++) {
111 ElementDefinition[] temp = Scene.getDataManager().getElementDefinition(factory[i].getDefinition());
112 if (temp.length != 0) {
113 list.add(factory[i]);
114 }
115 }
116
117 String[] returnVal = new String[list.size()];
118 for (int i = 0; i < returnVal.length; i++) {
119 returnVal[i] = ((VisualizationFactory)(list.get(i))).getName();
120 }
121 return returnVal;
122 }
123
124 public Visualization newVisualization(String name) {
125 Visualization newVisualization = null;
126
127 for (int i = 0; i < factory.length; i++) {
128 if (name.equals(factory[i].getName())) {
129 newVisualization = factory[i].createVisualization();
130 newVisualization.setName(name);
131 newVisualization.setDataSourceId(Scene.getDataSourceManager().getCurrentDataSourceId());
132 newVisualization.setFactory(factory[i]);
133 newVisualization.setDefinition(factory[i].getDefinition());
134 break;
135 }
136 }
137 visualizationList.add(newVisualization);
138 toVisualize.add(newVisualization);
139 Scene.getUIManager().addVisualization(newVisualization);
140 return newVisualization;
141 }
142
143 public void removeVisualization(Visualization visualization) {
144 visualizationList.remove(visualization);
145 toVisualize.remove(visualization);
146 }
147
148 public void preVisualize() {
149 if (dialog == null) {
150 createDialog();
151 }
152
153 int[] selected = new int[toVisualize.size()];
154 int selectedCounter = 0;
155
156 model.removeAllElements();
157
158 for (int i = 0; i < visualizationList.size(); i++) {
159 model.addElement(((Visualization)(visualizationList.get(i))).getName());
160 if (toVisualize.indexOf(visualizationList.get(i)) != -1) {
161 selected[selectedCounter] = i;
162 selectedCounter++;
163 }
164 }
165
166 listVisualization.setSelectedIndices(selected);
167
168 Scene.getUIManager().showDialog(dialog, 270, 360);
169 }
170
171 public void receiveEvent(EVolve.data.Event event) {
172 int currentDsourceId = Scene.getDataSourceManager().getCurrentDataSourceId();
173 for (int i = 0; i < visualization[event.getType()].length; i++) {
174 int dataSourceId = visualization[event.getType()][i].getDataSourceId();
175 if (dataSourceId == currentDsourceId)
176 visualization[event.getType()][i].receiveElement(event);
177 }
178 }
179
180 public void visualize() {
181 try {
182 for (int i = 0; i < visualization.length; i++) {
183 for (int j = 0; j < visualization[i].length; j++) {
184 int dataSourceId = visualization[i][j].getDataSourceId();
185 if (dataSourceId != Scene.getDataSourceManager().getCurrentDataSourceId())
186 continue;
187
188 for (int k = 0; k < visualization[i][j].getDimension().length; k++) {
189 if (visualization[i][j].getDimension()[k] instanceof ReferenceDimension) {
190 ((ReferenceDimension)(visualization[i][j].getDimension()[k])).visualize();
191 }
192 }
193 visualization[i][j].visualize();
194 visualization[i][j].updateMenu();
195 visualization[i][j].enableSortMenu();
196 }
197 }
198 } catch (NoDataPlotException e) { //a non-fatal exception, show message and then ignore it
199 Scene.showErrorMessage(e.getMessage());
200 }
201
202 }
203
204 private void dialogApply() {
205 dialog.setVisible(false);
206
207 toVisualize.clear();
208
209 int[] selected = listVisualization.getSelectedIndices();
210
211 for (int i = 0; i < selected.length; i++) {
212 toVisualize.add(visualizationList.get(selected[i]));
213 }
214
215 if (toVisualize.size() != 0) {
216 prepareListToBeVisualized();
217 Scene.visualize();
218 }
219 }
220
221 private void dialogCancel() {
222 dialog.setVisible(false);
223 }
224
225 public ArrayList getVisualizationType() {
226 ArrayList returnVal = new ArrayList();
227 for (int i = 0; i < visualizationList.size(); i++) {
228 String s = "" + ((Visualization)(visualizationList.get(i))).getSubjectDefinition().getType() + "";
229 if (returnVal.indexOf(s) == -1) {
230 returnVal.add(s);
231 }
232 }
233
234 return returnVal;
235 }
236
237 public VisualizationFactory getFactory(String name) {
238 VisualizationFactory retFac = null;
239 for (int i = 0; i < factory.length; i++) {
240 if (name.equals(factory[i].getName())) {
241 retFac = factory[i];
242 break;
243 }
244 }
245 return retFac;
246 }
247
248 public void autoPreVisualize(HashMap conf) {
249 Visualization visual= (Visualization)visualizationList.get(0);
250
251 visual.autoUpdateConfiguration(conf);
252
253 toVisualize.clear();
254
255 toVisualize.add(visualizationList.get(0));
256
257 if (toVisualize.size() != 0) {
258 prepareListToBeVisualized();
259 }
260 }
261
262 public void autoSaveResult(String path, String dataFn) {
263 Visualization visual= (Visualization)visualizationList.get(0);
264 visual.autoSave(path,dataFn);
265 }
266
267 public ArrayList getVisualizationList() {
268 return visualizationList;
269 }
270
271 public void prepareListToBeVisualized() {
272 visualization = new Visualization[Scene.getDataManager().getElementDefinition().length][];
273 for (int i = 0; i < visualization.length; i++) {
274 ArrayList list = new ArrayList();
275 for (int j = 0; j < toVisualize.size(); j++) {
276 if (((Visualization)(toVisualize.get(j))).getSubjectDefinition().getType() == i) {
277 list.add(toVisualize.get(j));
278 }
279 }
280 visualization[i] = new Visualization[list.size()];
281 for (int j = 0; j < visualization[i].length; j++) {
282 visualization[i][j] = (Visualization)(list.get(j));
283 visualization[i][j].preVisualize();
284 for (int k = 0; k < visualization[i][j].getDimension().length; k++) {
285 visualization[i][j].getDimension()[k].preVisualize();
286 }
287 }
288 }
289 }
290
291 // following methods are used in predefined visualization
292 public void cleanup() {
293 Scene.getUIManager().clearWindowsList();
294 for (int i=0; i<visualizationList.size(); i++) {
295 Visualization visual =(Visualization) visualizationList.get(i);
296 visual.getWindow().dispose();
297 }
298 init();
299 }
300
301 // following methods are used in linked visualization
302 public void addAllVisualizations() {
303 toVisualize.clear();
304 for (int i=0; i<visualizationList.size(); i++)
305 toVisualize.add(visualizationList.get(i));
306 }
307
308 public void prepareForLinkedViz(ArrayList viz,int beginRepaint) {
309 toVisualize.clear();
310
311 for (int i=beginRepaint; i< viz.size(); i++) {
312 toVisualize.add(viz.get(i));
313 }
314 if (toVisualize.size() != 0)
315 prepareListToBeVisualized();
316 }
317
318 public Visualization prepareForAsynOverlapViz(String name) {
319 Visualization newVisualization = null;
320
321 for (int i = 0; i < factory.length; i++) {
322 if (name.equals(factory[i].getName())) {
323 newVisualization = factory[i].createVisualization();
324 newVisualization.setName(name);
325 newVisualization.setFactory(factory[i]);
326 newVisualization.setDefinition(factory[i].getDefinition());
327 break;
328 }
329 }
330 return newVisualization;
331 }
332
333 public void visualizeNow() {
334 Visualization visual = getActiveVisualization();
335
336 if (visual != null) {
337 int dataSourceId = visual.getDataSourceId();
338
339 if (dataSourceId != Scene.getDataSourceManager().getCurrentDataSourceId()) {
340 Scene.getUIManager().selectDataSource(dataSourceId);
341 }
342
343 visualization = new Visualization[Scene.getDataManager().getElementDefinition().length][];
344 for (int i = 0; i < visualization.length; i++) {
345 ArrayList list = new ArrayList();
346 if (visual.getSubjectDefinition().getType() == i) {
347 list.add(visual);
348 }
349 visualization[i] = new Visualization[list.size()];
350 for (int j = 0; j < visualization[i].length; j++) {
351 visualization[i][j] = (Visualization)(list.get(j));
352 visualization[i][j].preVisualize();
353 for (int l = 0; l < visualization[i][j].getDimension().length; l++) {
354 (visualization[i][j].getDimension()[l]).preVisualize();
355 }
356 }
357 }
358
359 Scene.visualize();
360 }
361 }
362
363 public void cloneVisualization() {
364 Visualization visual = getActiveVisualization();
365
366 if (visual == null) return;
367
368 HashMap configuration = visual.getCurrentConfigure();
369
370 Visualization newViz = (Visualization)visual.clone();
371
372 visualizationList.add(newViz);
373 toVisualize.add(newViz);
374 Scene.getUIManager().addVisualization(newViz);
375 newViz.setName(visual.getName()+"- cloned");
376 newViz.autoUpdateConfiguration(configuration);
377
378 try {
379 newViz.getWindow().setBounds(visual.getWindow().getBounds());
380 newViz.visualize();
381 newViz.updateMenu();
382 newViz.enableSortMenu();
383 } catch (Exception e) {
384 // when the clone object is not visualized yet, this
385 // harmless exception happens.
386 }
387 }
388
389 public Visualization getActiveVisualization() {
390
391 Visualization visual = null;
392
393 for (int i=0; i<visualizationList.size(); i++) {
394 visual = (Visualization)visualizationList.get(i);
395 if (visual.getWindow().isSelected()) break;
396 }
397
398 return visual;
399 }
400
401 public void enablePhaseDetector(boolean enabled) {
402 phaseDetectorEnabled = enabled;
403 for (int i=0; i<visualizationList.size(); i++) {
404 Visualization visual = (Visualization)visualizationList.get(i);
405
406 if (visual instanceof TableViz) continue;
407
408 ((XYVisualization)visual).enablePhaseDetector(enabled);
409 }
410 }
411
412 public boolean isPhaseDetectorEnabled() {
413 return phaseDetectorEnabled;
414 }
415
416 public void refreshPhases() {
417 for (int i=0; i<visualizationList.size(); i++) {
418 Visualization visual = (Visualization)visualizationList.get(i);
419 visual.sort();
420 }
421
422 }
423
424 public PhaseOperation getPhaseOperation() {
425 return phaseOperation;
426 }
427 }
428